<?php
require_once "classes/model/EntityBase.php";
/**
 * Aparentemente PHP no permite doble herencia. La soluci�n que encuentro a esto es
 * hacer que TreeNodeBase extienda de EntityBase, pero que no implemente las funciones
 * abstractas de la misma (para que las tengan que implementar LogicTreeNode y VfsTreeNode).
 * FIXME: TODO LO ANTERIOR ES INNECESARIO: pasé el id y el tableName a TreeNodeBase.
 * @author Administrador
 *
 */
abstract class TreeNodeBase extends EntityBase
{
	protected $tableName;
	protected $idParent;
	protected $siblings;
	private $level;
	
	/**
	 * @param Array $contents El contenido del nodo.
	 * @param Array $siblings Los hijos del nodo.
	 */
	function __construct($tableName, $siblings, $level, $id = null, $idParent = null)
	{
		$this->id = $id;
		$this->tableName = $tableName;
		$this->siblings = $siblings;
		$this->level = $level;
	}

	/**
	 * Agrega un hijo.
	 * @param TreeNodeBase $sibling El hijo a agregar.
	 */
	function addSibling($sibling)
	{
		$sibling->setIdParent($this->id);
		if($this->containsSibling($sibling)){
			throw new Exception("Ya existe un módulo con el mismo nombre.");
		}
		$this->siblings[count($this->siblings)] = $sibling;
		return $sibling;
	}
	
	/**
	 * Hace que el nodo se haga visitar por un visitor.
	 * @param Visitor $visitor El visitor que visitar� este nodo.
	 */
	function visitNode($visitor)
	{
		$visitor->visit($this);
	}
	
	/**
	 * Visita este nodo y todos sus sub�rboles.
	 * @param Visitor $visitor El visitor.
	 */
	function visitTree($visitor)
	{
		$this->visitNode($visitor);
		foreach($this->siblings as $sibling){
			$sibling->visitTree($visitor);
		}
	}
	
	function getSiblings()
	{
		return $this->siblings;
	}
	
	function getId()
	{
		return $this->id;
	}
	
	function getTableName()
	{
		return $this->tableName;
	}
	
	function getLevel(){
		return $this->level;
	}
	
	function getIdParent(){
		return $this->idParent;
	}
	
	/**
	 * @param integer $id El id a setear como idParent.
	 */
	function setIdParent($id){
		$this->idParent = $id;
	}
}